﻿// cpp串口操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <windows.h>
#include "ComAccess.h"
#include "MySerialPort.h"

using namespace std;

void fun(char* buf, int size)
{

}

void 串口测试(void (*callback)(char* buf, int size))
{

	HANDLE m_hCom = CreateFile(TEXT("COM8"),
		GENERIC_READ | GENERIC_WRITE,  //读写权限
		0,	//不共享
		NULL, //默认安全
		OPEN_EXISTING,  //打开存在的串口
		0,	//同步方式
		NULL);  //无模板
	if (m_hCom == INVALID_HANDLE_VALUE)
	{
		return ;
	}

	DCB dcb = { 0 };
	dcb.DCBlength = sizeof(dcb);

	dcb.BaudRate = CBR_9600;// 9600;//波特率，默认9600
	dcb.ByteSize = 8;//数据位，默认8
	dcb.Parity = 0;  //0是无校验，Odd是奇1，even是偶2
	dcb.StopBits = ONESTOPBIT;//0表示1个停止位
	bool bSuccess = SetCommState(m_hCom, &dcb);

	if (!bSuccess)
	{
		//ComAccess::Close();
		return ;
	}

	//string str = "123456雷俊强";
	//const char* p = str.c_str(); //对方要用GBK编码接收，否则汉字乱码
	const char* p = "123456雷俊强";
	int len = strlen(p);
	DWORD written = 0;

	WriteFile(m_hCom, p, len, &written, NULL);
	if (written < len)
		return ; //没有写完，需要再写



	//下面读串口
	DWORD dwBytesRead;
	char szBuffer[10240]; // 假设缓冲区为1024字节
	int index = 0;
	char t[500]; // 假设缓冲区为1024字节
	memset(szBuffer, 0, sizeof(szBuffer));
	while (true)
	{
		memset(t, 0, sizeof(t));
		BOOL b = ReadFile(m_hCom, t, sizeof(t), &dwBytesRead, NULL);
		if (b == true)
		{
			 
			if (dwBytesRead > 0)
			{
				cout << dwBytesRead<<endl;
				// 处理读取到的数据				
				memcpy_s(szBuffer + index, sizeof(szBuffer), t, dwBytesRead);
				index = dwBytesRead + index;

				for (int i = 0; i < dwBytesRead; i++)
				{
					printf("%x", t[i]);
				}
				printf("\n");
				for (int i = 0; i < index; i++)
				{
					printf("%x", szBuffer[i]);
				}
				printf("\n");
				//cout << t << endl << szBuffer << endl;
				
			}
			else
			{
				if(index>0)
				{ 
				//回调到外面
					callback(szBuffer, index);
					index = 0;
				}
				//index = strlen(szBuffer);
			}
		}
		else
		{
			// 读取数据失败
			//break;
			b = b;
		}
		Sleep(100);
	}
	CloseHandle(m_hCom); //关闭串口
}
void proc(char* buf, int size)
{
	cout << "收到长度：" << size << buf[0] << buf[1] << endl;
}
int main()
{
	MySerialPort* com = new MySerialPort();
	com->Open(L"COM3");
	
	
	//const char* c = "12345服了服了";
	string s= "12345服了服了";
	const char* c = s.c_str();
	DWORD len = strlen(c);
	int m = com->WriteData((LPCVOID)c, len);


	com->ReadData(proc,100);
	
	system("pause");
	//delete com;

	getchar();

	//string s1 = "a" ;
	//string s2 = "雷";
	//string s3 = s1 + s2;
	//s3 = s3 + "ss";
	//s3.append("ddd");
	//
	//串口测试(fun);

	//ComAccess* com = new ComAccess();
	//com->Open(TEXT("COM8"), 9600, 0, 0, 8);
	//string str = "12345" ;
	//const char* c = str.c_str();
	//DWORD len = strlen(c);
	//com->WriteData((LPCVOID)c, len);

	//char szBuffer[1024]; // 假设缓冲区为1024字节
	//DWORD len2 = com->ReadData(szBuffer, sizeof(szBuffer), 500);

	//com->Close();


	// std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
